
////// 通用宏定义
// 复位标志位:为1时复位
`define Rst_Enabled 1'b1
// Clear标志位:1
`define Clear_Flag_Enabled 1'b1
`define Hold_Flag_Enabled 1'b1


// 指令长度:4字节
`define Instruction_Length 32'h4
// 指令地址总线宽度: 32位
`define Instruction_Addr_Bus 31:0
// 指令总线宽度: 32位
`define Instruction_Bus 31:0

// 零
`define Zero 1'b0
`define Zero32 32'b0



//////PC
// PC复位地址:1
`define PC_Addr_Rst 32'b0
// jump标志位:1
`define Jump_Flag_Enabled 1'b1













//////ROM
// ROM复位默认值
`define ROM_Rst 32'b0



//////Regs

//寄存器数量
`define Reg_Num 32
// 寄存器总线宽度
`define Reg_Data_Bus 31:0
// 寄存器地址总线宽度
`define Reg_Addr_Bus 4:0
// 0号寄存器地址
`define Reg_Zero_Addr 5'b0
// 0号寄存器值
`define Reg_Zero_Data 32'b0

// 寄存器复位标志
`define Regs_Rst_Flag_Enabled 1'b1
`define Regs_Rst_Flag_Disabled 1'b0

// 寄存器复位默认值
`define Regs_Rst 32'b0
// 寄存器复位地址:0
`define Regs_Addr_Rst 32'b0
// 寄存器复位值:0
`define Regs_Data_Rst 32'b0

// 寄存器写标志位
`define Write_Reg_Flag_Enabled 1'b1
`define Write_Reg_Flag_Disabled 1'b0
// 寄存器写



`define  Output_Top_Disabled 1'b0
`define  Output_Top_Enabled 1'b1

////// 指令

//// 特殊指令

`define INST_NOP    32'h00000013  // 不执行任何操作
`define INST_ECALL  7'b1110011  // 打印x10中的数值

///// I型指令
////opcode
`define INST_TYPE_I 7'b0010011
///func3
`define INST_ADDI   3'b000     // addi rd,rs1,imm:  rd = rs1 + imm
`define INST_SLTI   3'b010     // slti rd,rs1,imm: tmp = rs1 -imm,  if tmp >= 0 then rd = 0,else rd = 1
`define INST_SLTIU  3'b011     // sltiurd,rs1,imm: (c,tmp) = rs1 - imm,  if c==0 then rd = 0,else rd = 1
`define INST_XORI   3'b100     // xori rd,rs1,imm:  rd = rs1 ^ imm
`define INST_ORI    3'b110     // ori rd,rs1,imm: rd = rs1 | imm
`define INST_ANDI   3'b111     // addi rd,rs1,imm: rd = rs1 & imm

`define INST_SLLI   3'b001     // addi rd,rs1,imm: rd = rs1 << imm
`define INST_SRLI_or_SRAI   3'b101 

`define INST_SRLI   7'b0000000
`define INST_SRAI   7'b0100000






///// R型指令
////opcode
`define INST_TYPE_R 7'b0110011
///func3
`define INST_ADD_or_SUB 3'b000
`define INST_SLL 3'b001
`define INST_SLT 3'b010
`define INST_SLTU 3'b011
`define INST_XOR 3'b100
`define INST_SRL_o_SRA 3'b101
`define INST_OR 3'b110
`define INST_AND 3'b111
//func7
`define INST_ADD 7'b0000000     //add rd,rs1,rs2:    rd = rs1 + rs2
`define INST_SUB 7'b0100000     //sub rd,rs1,rs2:    rd = rs1 - rs2

`define INST_SRL 7'b0000000  
`define INST_SRA 7'b0100000









//////// TIP: RAM的地址数以32字节为单位，传入的地址参数必须是4的倍数
////// S型指令
////opcode
`define INST_TYPE_S 7'b0100011
///func3
`define INST_SB     3'b000      //sb rs2,imm(rs1)     RAM(rs1 + imm) = rs2[7:0]
`define INST_SH     3'b001      //sh rs2,imm(rs1)     RAM(rs1 + imm) = rs2[15:0]
`define INST_SW     3'b010      //sw rs2,imm(rs1)     RAM(rs1 + imm) = rs2[31:0]



////// L型指令
////opcode
`define INST_TYPE_L 7'b0000011
///func3
`define INST_LB     3'b000      //lb rs2,imm(rs1)    rs2 = RAM(rs1 + imm)[7:0] 符号位扩展
`define INST_LH     3'b001      //lh rs2,imm(rs1)    rs2 = RAM(rs1 + imm)[15:0] 符号位扩展
`define INST_LW     3'b010      //lw rs2,imm(rs1)    rs2 = RAM(rs1 + imm)[31:0] 符号位扩展
`define INST_LBU    3'b100      //lbu rs2,imm(rs1)    rs2 = RAM(rs1 + imm)[7:0] 无符号扩展
`define INST_LHU    3'b101      //lhu rs2,imm(rs1)    rs2 = RAM(rs1 + imm)[15:0] 无符号扩展



////// J型指令
////opcode
`define INST_JAL 7'b1101111     //JAL rd,imm       jump to (current addr + imm) ,rd = current addr + 4
`define INST_JALR 7'b1100111


////// B型指令
////opcode
`define INST_TYPE_B 7'b1100011
///func3
`define INST_BEQ 3'b000         //beq rs1,rs2,imm     if(rs1 == rs2) jump to (current addr + imm)
`define INST_BNE 3'b001         //bne rs1,rs2,imm     if(rs1 != rs2) jump to (current addr + imm)
`define INST_BLT 3'b100         //bltu rs1, rs2, imm   if(rs1 < rs2) jump to  (current addr + imm)
`define INST_BGE 3'b101         //bltu rs1, rs2, imm   if(rs1 >= rs2) jump to  (current addr + imm)
`define INST_BLTU 3'b110        //bltu rs1, rs2, imm   if(rs1 < rs2) jump to  (current addr + imm)
`define INST_BGEU 3'b111        //bltu rs1, rs2, imm   if(rs1 >= rs2) jump to  (current addr + imm)




////// U型指令
`define INST_LUI 7'b0110111
`define AUIPC 7'b0010111








////// ALU
//ALU操作总线宽
`define ALU_Operation_BUS 4:0
//ALU参数总线宽
`define ALU_Parameter_BUS 31:0

//ALU操作复位值
`define ALU_Rst_Operation 1'b0
//ALU数据复位值
`define ALU_Rst_Data 32'b0

//ALU写寄存器标志位
`define Write_reg_from_ALU_Disabled 1'b0
`define Write_reg_from_ALU_Enabled 1'b1

`define Write_Reg_from_CU_Disabled 1'b0
`define Write_Reg_from_CU_Enabled 1'b1


////ALU运算符

`define ALU_NOP 5'b00000
//ALU加法
`define ALU_ADD 5'b00001
//ALU减法
`define ALU_SUB 5'b00010
//ALU异或
`define ALU_XOR 5'b00011
//ALU或
`define ALU_OR 5'b00100
//ALU和
`define ALU_AND 5'b00101

//ALU逻辑左移   a为原输入，b为位移量
`define ALU_Logical_Left_Shift 5'b00110
//ALU逻辑右移   a为原输入，b为位移量
`define ALU_Logical_Right_Shift 5'b00111
//ALU算术右移   a为原输入，b为位移量
`define ALU_Arithmetic_Right_Shift 5'B01000



//ALU有符号小于置1
`define ALU_Compare_Less_Set_1 5'b10000
//ALU无符号小于置1
`define ALU_Unsign_Compare_Less_Set_1 5'b10001













////// RAM
//RAM地址总线宽
`define RAM_Addr_BUS 31:0
//RAM操作总线宽
`define RAM_Operation_BUS 3:0
//RAM数据总线宽
`define RAM_Data_BUS 31:0


`define RAM_Access_Flag_Disabled 1'b0
`define RAM_Access_Flag_Enabled 1'b1
//RAM写标志
`define RAM_Write_Disabled 1'b0
`define RAM_Write_Enabled 1'b1
//RAM读标志
`define RAM_Read_Disabled 1'b0
`define RAM_Read_Enabled 1'b1


//RAM操作指令
`define RAM_NOP 4'b0000

//RAM写数据
`define RAM_Write_Byte 4'b0001
`define RAM_Write_Half_Word 4'b0010
`define RAM_Write_Word 4'b0011

//RAM读数据
`define RAM_Read_Byte 4'b1001
`define RAM_Read_Half_Word 4'b1010
`define RAM_Read_Word 4'b1011
`define RAM_Read_Byte_Unsigned 4'b1101
`define RAM_Read_Half_Word_Unsigned 4'b1110














